/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente;

import Comunicaciones.CorbaConexionCliente;
import PaqueteCORBA.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author careigma
 */
public class Cliente extends ClienteCORBAPOA {

    @Override
    public void avisar(String cadenaAviso) {
        JOptionPane.showMessageDialog(clienteGUI, "Nueva notificacioón : " + cadenaAviso, "Aviso", JOptionPane.OK_OPTION);
    }

    void desconectar() {
        sesionCORBA.desconectar();
    }

    private class RegistroCliente extends Thread {

        private Cliente cli;
        private String nombreCliente;

        public RegistroCliente(Cliente _cli, String _nomCli) {
            cli = _cli;
            nombreCliente = _nomCli;
        }

        public void run() {
            cli.corbaConexionCliente.registrarCliente(cli, nombreCliente);
        }
    }
    protected CorbaConexionCliente corbaConexionCliente;
    private ClienteGUI clienteGUI;
    private AulaVirtualCORBA aulavirtualCORBA;
    private SesionCORBA sesionCORBA;
    private String nombreCliente;

    public Cliente(ClienteGUI aClienteGui) {
        entrar("localhost", 4444, aClienteGui);
    };
    
    public void entrar(String nameServer, int puerto, ClienteGUI _clienteGui) {
        clienteGUI = _clienteGui;

        corbaConexionCliente = new CorbaConexionCliente(puerto, nameServer);
        aulavirtualCORBA = corbaConexionCliente.resolverAulavirtual("AulaVirtual");
        String nombre_sesion = aulavirtualCORBA.entrar();
        sesionCORBA = corbaConexionCliente.resolverSesion(nombre_sesion);

        // Registra el cliente -> lanza orb.run() -> necesita un hilo
        nombreCliente = nombre_sesion + "Cliente";
        RegistroCliente regCli = new RegistroCliente(this, nombreCliente);
        regCli.start();
    }

    public int login(String auser, char[] apassword) {
        int login = sesionCORBA.identificarse(auser, new String(apassword));
        return login;
    }

    public String[] getAsignaturasMatriculadas() throws excepcion {
        InfoAsignatura[] asignaturasTotal;

        asignaturasTotal = sesionCORBA.getAsignaturas();

        String[] asignaturas = new String[asignaturasTotal.length];
        int j = 0;

        for (int i = 0; i < asignaturasTotal.length; i++) {
            if (asignaturasTotal[i].matriculado) {
                asignaturas[j] = asignaturasTotal[i].idAsignatura;
                j++;
            }
        }

        if (j == 0) {
            throw new excepcion("El usuario no está matriculado en ninguna asignatura");
        }

        String[] retorno = new String[j];
        System.arraycopy(asignaturas, 0, retorno, 0, j);

        return retorno;
    }

    public String[] getAsignaturas() {
        InfoAsignatura[] asignaturasTotal;
        try {
            asignaturasTotal = sesionCORBA.getAsignaturas();
        } catch (excepcion ex) {
            return new String[0];
        }
        String[] asignaturas = new String[asignaturasTotal.length];

        for (int i = 0; i < asignaturasTotal.length; i++) {
            asignaturas[i] = asignaturasTotal[i].idAsignatura;
        }

        return asignaturas;
    }

    public void matricular(String aIdAsignatura) throws PaqueteCORBA.excepcion {
        sesionCORBA.matricular(aIdAsignatura);
    }

    public String[] getTemasAsignatura(String idAsig) throws PaqueteCORBA.excepcion {
        return sesionCORBA.getTemasAsignatura(idAsig);
    }
    
    public void anyadirPregunta(String aIdAsig, String aIdTema, String aEnunciadoP) {
        sesionCORBA.anyadirPregunta(aIdAsig, aIdTema, aEnunciadoP);
    }

    public void anyadirRespuesta(String aIdPregunta, String aEnunciadoR, boolean aEsCierta) throws excepcion {
        sesionCORBA.anyadirRespuesta(aIdPregunta, aEnunciadoR, aEsCierta);
    }

	//TO DO: Esto falla !!

    public String[] getExamenes() {
		try {
			//Devuelve un array con los ID de todos los exámenes de ese profesor
			InfoExamen[] ie = sesionCORBA.getExamenes();
			String[] ret = new String[ie.length];

			for (int i = 0; i < ie.length; i++)
				ret[i] = ie[i].idExamen;

			return ret;
		} catch (excepcion ex) {
			//no pasa nada si no hay examenes, simplemente no se muestra ninguno
			return new String[0];
		}
    }

    public PaqueteCORBA.InfoExamen[] getNotasExamen(String idExamen) {
        return sesionCORBA.verNotasDelExamen(idExamen);
    }
       

    public PaqueteCORBA.InfoExamenEspecifico getInfoExamenEspecifico(String idAlumno, String idExamen) {
        return sesionCORBA.verExamenEspecificoAlumno(idExamen, idAlumno);
    }

    public void ponerExamen(String aIdAsignatura, PaqueteCORBA.InfoTema[] aTemas, String aFechaIni, String aFechaFin) throws excepcion {
        sesionCORBA.ponerExamen(aIdAsignatura, aTemas, aFechaIni, aFechaFin);
    }

    public PaqueteCORBA.InfoExamen[] getExamenesAlumno() {
        try {
            return sesionCORBA.getExamenes();
        } catch (excepcion ex) {
            System.out.println(ex.msg);
        }

        return new InfoExamen[0];
    }
    
    public PaqueteCORBA.InfoNotificacionExamen[] getNotificaciones() {
        return sesionCORBA.getNotificacionesExamen();
    }

    public PaqueteCORBA.InfoExamenEspecifico generarExamen(String idExamen) throws PaqueteCORBA.excepcion {
        return sesionCORBA.generarExamen(idExamen);
    }

    public void enviarExamenEspecificoResulto(String idExamen, InfoExamenEspecifico ieeA) {
        sesionCORBA.terminarExamen(idExamen, ieeA);
    }

    public PaqueteCORBA.InfoExamenEspecifico getInfoExamenEspecificoAlumno(String idExamen) {
        return sesionCORBA.verExamenEspecifico(idExamen);        
    }
    
    public void setNoficacionLeida(String idNotificacion){
        sesionCORBA.setNoficacionLeida(idNotificacion);        
    }
}
